﻿package com.sci;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class Tools
{
	/** 获取目录下以endName结尾的文件 */
	public static File getFileEndsWith(String baseDir, final String endName)
	{
		String pattern = ".*?" + Pattern.quote(endName) + "$";
		return getFileWithPattern(baseDir, pattern);
	}
	
	/** 获取目录下匹配pattern的文件 */
	public static File getFileWithPattern(String baseDir, final String pattern)
	{
		File file = new File(baseDir);
		if (file.exists())
		{
			File[] list = file.listFiles();
			for (File f : list)
			{
				if (f.getName().matches(pattern)) return f;
			}
		}
		return null;
	}
	
	/** 创建file所在的路径信息 */
	public static void mkdirs(File file)
	{
		File parent = file.getParentFile();
		if (!parent.exists())
		{
			mkdirs(parent);
			parent.mkdirs();
		}
	}
	
	/** 删除指定文件 */
	public static void Delete(String filePath)
	{
		Delete(new File(filePath));
	}
	
	/** 删除指定文件 */
	public static void Delete(File f)
	{
		for (File fi : f.listFiles())
		{
			if (fi.isDirectory())
			{
				Delete(fi);
			}
			else
			{
				fi.delete();
			}
		}
		f.delete();
	}
	
	/** 获取Apk包的META-INF文件夹 */
	public static ArrayList<String> getZipSubFile(String zipPath, String outPath, String regex)
	{
		ArrayList<String> list = new ArrayList<String>();
		
		try
		{
			ZipFile zipFile = new ZipFile(zipPath);
			Enumeration en = zipFile.entries();
			ZipEntry entry = null;
			
			while (en.hasMoreElements())
			{
				// 获取zip文件的entry入口
				entry = (ZipEntry) en.nextElement();
				String entryName = entry.getName();
				
				// 忽略不匹配的文件信息
				if (!regex.equals(""))
				{
					Matcher match = Pattern.compile(regex).matcher(entryName);
					if (!match.find()) continue;
				}
				
				// 生成解压文件
				InputStream in = zipFile.getInputStream(entry);
				
				String outfile = outPath + File.separator + entry.getName();
				File file = new File(outfile);
				mkdirs(file);
				file.createNewFile();
				FileOutputStream out = new FileOutputStream(file);
				
				try
				{
					int len;
					byte[] by = new byte[1024];
					while ((len = in.read(by)) != -1)
					{
						out.write(by, 0, len);
					}
					// out.flush();
					list.add(outfile);		// 记录生成的文件
				}
				catch (IOException e)
				{
					e.printStackTrace();
				}
				finally
				{
					out.close();
					in.close();
				}
			}
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
		return list;
	}
	

	//-----------------------------------------------------------------------------------------
	/** 获取paths路径下所有文件信息 */
	public static String[] getSubFiles(String... Paths)
	{
		List<String> list = new ArrayList<String>();	// paths路径下所有文件信息
		
		for(String path : Paths)
		{
			File file = new File(path);
			List<String> subFiles = getSubFiles(file);	// 获取路径path下所有文件列表信息
			
			list = ListAdd(list, subFiles);
		}
		
		String[] A = List2Array(list);					// 转化为数组形式
		
		return A;
	}
	
	/** 合并list1和list2到新的list */
	public static List<String> ListAdd(List<String> list1, List<String> list2)
	{
		List<String> list = new ArrayList<String>();
		
		for(String path : list1) if(!list.contains(path)) list.add(path);
		for(String path : list2) if(!list.contains(path)) list.add(path);
		
		return list;
	}
	
	/** 获取file目录下所有文件列表 */
	public static List<String> getSubFiles(File file)
	{
		List<String> list = new ArrayList<String>();
		
		if(file.exists())
		{
			if(file.isFile()) 	// 若为文件则添加到list
			{
				String path = file.getAbsolutePath();
				if(!list.contains(path)) list.add(path);
			}
			else				// 若为目录，则添加目录下的所有文件到list
			{
				for(File iteam : file.listFiles())
				{
					List<String> L = getSubFiles(iteam);	// 获取子目录下所有文件列表
					
					for(String path : L)
					{
						if(!list.contains(path)) list.add(path);
					}
				}
			}
		}
		
		return list;
	}
	
	/** 转化list为数组 */
	public static String[] List2Array(List<String> list)
	{
		int size = (list == null ? 0 : list.size());
		String[] A = new String[size];
		
		int i=0;
		for(String S : list)
		{
			A[i++] = S;
		}
		
		return A;
	}
}
